module multiplication_module (shift, b, product, c_out, reset);
	parameter SIZE = 31;
	//input
	input shift;		
	input [SIZE:0] b;
	input reset;
	output [SIZE:0] product;
	output [SIZE:0] c_out;
		
	wire [SIZE:0] produto;
	wire [SIZE:0] produto_parcial;
	wire [SIZE:0] produto_resp;
	wire [SIZE:0] carry_out;
	wire [SIZE:0] carry_in;
	wire [SIZE:0] end_carry;
	wire [SIZE:0] final_deslocado;
	
	carry_save_adder inst_adder (.a(produto_parcial), .b(b), .s(produto), .cout(carry_out), .cin(carry_in));
	
	desloc_carry inst_desloc_carry (.shift(shift), .carry_in(carry_out), .carry_desloc(carry_in), .end_carry(end_carry), .reset(reset));
	
	partial_product inst_produto_parcial (.product(produto), .shift(shift), .dislocated_product(produto_parcial), .partial_product(produto_resp), .reset(reset), .final_deslocado(final_deslocado));

	assign c_out = end_carry;
	assign product = produto_resp;
	
	
endmodule 